import axios from 'axios'
import { useUserStore } from '@/stores/user'
import LoadingBox from '@/utils/LoadingBox'
import MessageBox from '@/utils/MessageBox'

const http = {

    /**
     * 发起HTTP请求
     * @param {'GET'|'POST'} method 请求方式
     * @param {String} url 请求地址
     * @param {Object} data 请求数据
     * @param {Function} fn 请求成功后执行的函数
     * @param {Boolean} loading 是否显示加载动画
     * @returns {Promise}
     */
    request: (method, url, params={}, data={}, fn=null, loading = false) => {
        const userStore = useUserStore();
        return new Promise((resolve) => {
            const loadingInst = LoadingBox.open(loading)

            axios.defaults.baseURL = import.meta.env.VITE_API_BASE_URL || '/api'
            // axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlenco ded'
            !userStore.access_token || (axios.defaults.headers.common['Authorization'] = 'Bearer '+ userStore.access_token);
            axios({ method, url, params, data })
                .then((res) => {
                    const response = res.data
                    if (response.code==1) {
                        // !response.message || MessageBox.success(response.message)
                        resolve(fn ? fn(response) : response)
                    } else {
                        switch (String(response.code)) {
                            case "4001": // 登录已失效
                            case "4002": // 身份认证失败
                            case "4003": // 非法的身份
                            case "4004": // 非法的身份
                                // 跳转到登录页面重新登录
                                MessageBox.error(response.message || '请重新登录', () => userStore.logout(), 2000)
                                break
                            default:
                                MessageBox.error(response.message || '发生未知错误')
                        }
                        resolve()
                    }
                })
                .catch((err) => {
                    MessageBox.error(err.message)
                    resolve()
                })
                .finally(() => loadingInst.close())
        })
    },

    /**
     * 发起GET请求
     * @param {String} url 请求地址
     * @param {Object} params 请求数据
     * @param {Function} fn 请求成功后执行的函数
     * @param {Boolean} loading 是否显示加载动画
     * @returns {Promise}
     */
    get: (url, params, fn, loading) => {
        return http.request('GET', url, params, {}, fn, loading)
    },

    /**
     * 发起POST请求
     * @param {String} url 请求地址
     * @param {Object} data 请求数据
     * @param {Function} fn 请求成功后执行的函数
     * @param {Boolean} loading 是否显示加载动画
     * @returns {Promise}
     */
    post: (url, data, fn, loading) => {
        return http.request('POST', url, {}, data, fn, loading)
    },

    /**
     * 发起PUT请求
     * @param {String} url 请求地址
     * @param {Object} data 请求数据
     * @param {Function} fn 请求成功后执行的函数
     * @param {Boolean} loading 是否显示加载动画
     * @returns {Promise}
     */
    put: (url, data, fn, loading) => {
        return http.request('PUT', url, {}, data, fn, loading)
    },

    /**
     * 发起PUT请求
     * @param {String} url 请求地址
     * @param {Object} data 请求数据
     * @param {Function} fn 请求成功后执行的函数
     * @param {Boolean} loading 是否显示加载动画
     * @returns {Promise}
     */
    delete: (url, data, fn, loading) => {
        return http.request('DELETE', url, {}, data, fn, loading)
    },
}

export default http